import axios from 'axios'
import Cookie from 'vue-cookie'
import { router } from '@/router'
import * as Constant from './constant'
import * as Urls from '@/api/urls'

// 请求超时时间
axios.defaults.timeout = 8000
axios.defaults.baseURL = Urls.defaultURL
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'

// 请求白名单
const reqWhites = [Urls.LoginUrl]
// 请求拦截器
axios.interceptors.request.use(config => {
  if (reqWhites.includes(config.url)) {
    return config
  }
  // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
  // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
  const token = Cookie.get(Constant.TOKEN_KEY)
  token && (config.headers.token = token)
  return config
}, error => {
  return Promise.error(error)
})

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.data.code && response.data.code === 401) {
      Cookie.delete(Constant.TOKEN_KEY)
      router.replace('/login')
      console.log('request')
    }
    return Promise.resolve(response.data)
  },
  // 服务器状态码不是200的情况
  error => {
    // 处理请求超时
    const {
      code,
      message
    } = error
    if (code === 'ECONNABORTED' || message === 'Network Error') { // 请求超时
      console.log('Network Error')
      // return Promise.reject(new Error('请求超时'))
      return
    }

    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 403:
          console.log(403)
          break
          // 403 token过期
          // 登录过期对用户进行提示
          // 清除本地token和清空vuex中token对象
          // 跳转登录页面
        case 401:
          console.log(401)
          break
          // 404请求不存在
        case 404:
          console.log(404)
          break
          // 其他错误，直接抛出错误提示
        default:
          console.log(500)
          break
          // console.log(error.response.data.message)
          // return Promise.reject(new Error('网络请求错误'))
      }
    }
  }
)

export default axios
